# -*- coding: utf-8 -*-
__author__ = 'chen'

import pandas as pd
from pandas import Series, DataFrame
import numpy as np

# 数据规整
rnames = ['user_id', 'movie_id', 'rating', 'timestamp']
ratings = pd.read_table(r'../data/CFData/rating.dat', sep='::', header=None, names=rnames, engine='python')
print(ratings)
print("*" * 60)

# ratings 表中对我们有用的仅是 user_id、movie_id 和 rating 这三列，因此我们将这三列取出，放到一个以 user 为行，movie 为列，rating 为值的表 data 里面。
data = ratings.pivot(index='user_id', columns='movie_id', values='rating')
print(data)
print("*" * 60)

# 测定min_periods参数
# 首先，要找出重叠评分最多的一对用户。我们新建一个以 user 为行列的方阵 foo，然后挨个填充不同用户间重叠评分的个数：
# 这段代码特别费时间，因为最后一行语句要执行 4000*4000 = 1600万遍；
# 在data中挑选一对重叠评分最多的用户，用他们之间的相关系数的标准差去对整体标准差做点估计
foo = DataFrame(np.empty((len(data.index), len(data.index)), dtype=int), index=data.index, columns=data.index)
print(foo)
print("*" * 60)
for i in foo.index:
    for j in foo.columns:
        foo.ix[i, j] = data.ix[i][data.ix[j].notnull()].dropna().count()
# 找到的最大值所对应的行列分别为 424 和 4169，这两位用户之间的重叠评分数为 998：
for i in foo.index:
    # 先把对角线的值设为 0
    foo.ix[i, i] = 0
ser = Series(np.zeros(len(foo.index)))
for i in foo.index:
    # 计算每行中的最大值
    ser[i] = foo[i].max()
# 返回ser的最大值所在的行号
print(ser.idxmax())
# 取得最大值
print(ser[4169])
# 取得另一个 user_id
print(foo[foo == 998][4169].dropna())
